﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class Organizacao
    {

        #region Variaveis Membro
        private int _idOrganizacao;
        private StatusOrganizacao _status;
        private string _razaoSocial;
        private string _nomeFantasia;
        private Double _cnpj;
        private string _cnpjMasc;
        private int _dataBase;
        private string _impostoSimples;
        private string _pat;
        private List<TipoOrganizacaoOrganizacao> _tipoOrganizacao;
        private List<OrganizacaoTelefone> _organizacaoTelefone;
        private List<OrganizacaoEndereco> _organizacaoEndereco;
        private List<OrganizacaoPatrocinadorPrestador> _organizacaoPrestador;
        private List<OrganizacaoPatrocinadorPrestador> _organizacaoPatrocinador;

        private List<OrganizacaoFilial> _organizacaoFilial;
        private List<FornecedorServicoProduto> _fornecedorServicoProduto;
        private List<OrganizacaoPrestadorServicoProduto> _organizacaoPrestadorServicoProduto;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdOrganizacao
        {
            get { return _idOrganizacao; }
            set { _idOrganizacao = value; }
        }
        public StatusOrganizacao Status
        {
            get { return _status; }
            set { _status = value; }
        }        
        public string RazaoSocial
        {
            get { return _razaoSocial; }
            set { _razaoSocial = value; }
        }        
        public string NomeFantasia
        {
            get { return _nomeFantasia; }
            set { _nomeFantasia = value; }
        }
        public string CnpjMasc
        {
            get { return _cnpjMasc; }
            set { _cnpjMasc = value; }
        }
        public Double Cnpj
        {
            get { return _cnpj; }
            set { _cnpj = value; }
        }          
        public int DataBase
        {
            get { return _dataBase; }
            set { _dataBase = value; }
        }        
        public string ImpostoSimples
        {
            get { return _impostoSimples; }
            set { _impostoSimples = value; }
        }
        public string Pat
        {
            get { return _pat; }
            set { _pat = value; }
        }
        public List<TipoOrganizacaoOrganizacao> TipoOrganizacao
        {
            get { return _tipoOrganizacao; }
            set { _tipoOrganizacao = value; }
        }
        public List<OrganizacaoFilial> OrganizacaoFilial
        {
            get { return _organizacaoFilial; }
            set { _organizacaoFilial = value; }
        }
        public List<OrganizacaoPatrocinadorPrestador> OrganizacaoPrestador
        {
            get { return _organizacaoPrestador; }
            set { _organizacaoPrestador = value; }
        }
        public List<OrganizacaoPatrocinadorPrestador> OrganizacaoPatrocinador
        {
            get { return _organizacaoPatrocinador; }
            set { _organizacaoPatrocinador = value; }
        }
        public List<OrganizacaoTelefone> OrganizacaoTelefone
        {
            get { return _organizacaoTelefone; }
            set { _organizacaoTelefone = value; }
        }
        public List<OrganizacaoEndereco> OrganizacaoEndereco
        {
            get { return _organizacaoEndereco; }
            set { _organizacaoEndereco = value; }
        }
        public List<FornecedorServicoProduto> FornecedorServicoProduto
        {
            get { return _fornecedorServicoProduto; }
            set { _fornecedorServicoProduto = value; }
        }
        public List<OrganizacaoPrestadorServicoProduto> OrganizacaoPrestadorServicoProduto
        {
            get { return _organizacaoPrestadorServicoProduto; }
            set { _organizacaoPrestadorServicoProduto = value; }
        }
        #endregion

        #region Construtores
        public Organizacao()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public Organizacao(int idOrganizacao)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idOrganizacao, false, false);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public Organizacao(Double cnpj)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(cnpj);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public Organizacao(int idOrganizacao, bool carregaPatrocinadores, bool carregaPrestadores)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idOrganizacao, carregaPatrocinadores, carregaPrestadores);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idOrganizacao, bool carregaPatrocinadores, bool carregaPrestadores)
        {
            try
            {
                var consulta = from org in _context.tab_organizacao
                               where org.Id_organizacao == idOrganizacao
                               select new
                               {
                                   org.Id_organizacao,
                                   org.tab_status_organizacao.Id_status,
                                   org.razao_social,
                                   org.nome_fantasia,
                                   org.cnpj,
                                   org.Data_base,
                                   org.Imp_Simples,
                                   org.pat
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idOrganizacao = list.Id_organizacao;
                    this._status = new StatusOrganizacao(list.Id_status);
                    this._razaoSocial = list.razao_social;
                    this._nomeFantasia = list.nome_fantasia;
                    this._cnpj = list.cnpj;
                    this._cnpjMasc = FormataCNPJ(list.cnpj.ToString());
                    this._dataBase = (list.Data_base == null) ? 0 : Int32.Parse(list.Data_base.ToString());
                    this._impostoSimples = list.Imp_Simples;
                    this._pat = list.pat;

                    CarregaTipoOrganizacao(list.Id_organizacao);

                    if (carregaPatrocinadores)
                        CarregaPatrocinadores(list.Id_organizacao);
                    if (carregaPrestadores)
                        CarregaPrestadores(list.Id_organizacao);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void Carregar(Double cnpj)
        {
            try
            {
                var consulta = from org in _context.tab_organizacao
                               where org.cnpj == cnpj
                               select new
                               {
                                   org.Id_organizacao,
                                   org.tab_status_organizacao.Id_status,
                                   org.razao_social,
                                   org.nome_fantasia,
                                   org.cnpj,
                                   org.Data_base,
                                   org.Imp_Simples,
                                   org.pat
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idOrganizacao = list.Id_organizacao;
                    this._status = new StatusOrganizacao(list.Id_status);
                    this._razaoSocial = list.razao_social;
                    this._nomeFantasia = list.nome_fantasia;
                    this._cnpj = list.cnpj;
                    this._cnpjMasc = FormataCNPJ(list.cnpj.ToString());
                    this._dataBase = (list.Data_base == null) ? 0 : Int32.Parse(list.Data_base.ToString());
                    this._impostoSimples = list.Imp_Simples;
                    this._pat = list.pat;

                    CarregaTipoOrganizacao(list.Id_organizacao);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void CarregaTipoOrganizacao(int idOrganizacao)
        {
            try
            {
                TipoOrganizacaoOrganizacao tipoOrganOrgan = new TipoOrganizacaoOrganizacao();
                this._tipoOrganizacao = tipoOrganOrgan.SelectOrganizacao(idOrganizacao);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void CarregaTelefones(int idOrganizacao)
        {
            try
            {
                OrganizacaoTelefone telefone = new OrganizacaoTelefone();
                _organizacaoTelefone = telefone.SelectOrganizacao(idOrganizacao);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void CarregaEnderecos(int idOrganizacao)
        {
            try
            {
                OrganizacaoEndereco endereco = new OrganizacaoEndereco();
                _organizacaoEndereco = endereco.SelectOrganizacao(idOrganizacao);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void CarregaPatrocinadores(int idOrganizacao)
        {
            try
            {
                OrganizacaoPatrocinadorPrestador organPatrocinador = new OrganizacaoPatrocinadorPrestador();
                _organizacaoPatrocinador = organPatrocinador.SelectPatrocinadores(idOrganizacao);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void CarregaPrestadores(int idOrganizacao)
        {
            try
            {
                OrganizacaoPatrocinadorPrestador organPrestador = new OrganizacaoPatrocinadorPrestador();
                _organizacaoPrestador = organPrestador.SelectPrestadores(idOrganizacao);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private int[] ObterCodigosStatus(List<StatusOrganizacao> statusOrganizacao)
        {
            int[] _codigos = new int[statusOrganizacao.Count];
            int _cont = 0;

            foreach (StatusOrganizacao item in statusOrganizacao)
            {
                _codigos[_cont] = item.IdStatusOrganizacao;
                _cont++;
            }

            return _codigos;
        }
        private static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
        {
            if (null == valueSelector)
            {
                throw new
                    ArgumentNullException("valueSelector");
            }
            if (null == values) { throw new ArgumentNullException("values"); }

            ParameterExpression p = valueSelector.Parameters.Single();
            if (!values.Any())
            {
                return e => false;
            }

            var equals = values.Select(value =>
            (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value,
            typeof(TValue))));
            var body = equals.Aggregate<Expression>((accumulate, equal) =>
            Expression.Or(accumulate, equal));
            return Expression.Lambda<Func<TElement, bool>>(body, p);
        }
        private string FormataCNPJ(string cnpj)
        {
            return cnpj.Substring(0, 2) + "." + cnpj.Substring(2, 3) + "." + cnpj.Substring(5, 3) + "/" + cnpj.Substring(8, 4) + "-" + cnpj.Substring(12, 2);
        }
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao
        public List<Organizacao> SelectAll()
        {
            try
            {
                List<Organizacao> listOrganizacao = new List<Organizacao>();

                var consulta = from org in _context.tab_organizacao
                               select new
                               {
                                   org.Id_organizacao,
                                   org.tab_status_organizacao.Id_status,
                                   org.razao_social,
                                   org.nome_fantasia,
                                   org.cnpj,
                                   org.Data_base,
                                   org.Imp_Simples,
                                   org.pat
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Organizacao organizacao = new Organizacao();
                    organizacao.IdOrganizacao = list.Id_organizacao;
                    organizacao.Status = new StatusOrganizacao(list.Id_status);
                    organizacao.RazaoSocial = list.razao_social;
                    organizacao.NomeFantasia = list.nome_fantasia;
                    organizacao.Cnpj = list.cnpj;
                    organizacao.CnpjMasc = FormataCNPJ(FormataCNPJ(list.cnpj.ToString()));
                    organizacao.DataBase = (list.Data_base == null) ? 0 : Int32.Parse(list.Data_base.ToString());
                    organizacao.ImpostoSimples = list.Imp_Simples;
                    organizacao.Pat = list.pat;

                    listOrganizacao.Add(organizacao);
                }
                return listOrganizacao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<Organizacao> SelectPor(string nome, int idTipoOrganizacao, List<StatusOrganizacao> listStatus)
        {
            try
            {
                bool pesquisaStatus = false;
                List<Organizacao> listOrganizacao = new List<Organizacao>();
                int[] codStatus = ObterCodigosStatus(listStatus);

                foreach (StatusOrganizacao item in listStatus)
                {
                    pesquisaStatus = true;
                    break;
                }

                var consulta = from org in (pesquisaStatus) ? _context.tab_organizacao.Where((BuildContainsExpression<tab_organizacao, int>(item => item.tab_status_organizacao.Id_status, codStatus))) : _context.tab_organizacao
                               join tporgan in _context.tab_tporgan_organ on org.Id_organizacao equals tporgan.tab_organizacao.Id_organizacao
                               where tporgan.tab_tipo_organizacao.id_tipo_organizacao == idTipoOrganizacao
                               && ((nome != "") ? org.nome_fantasia.Contains(nome) : 1 == 1)
                               orderby org.nome_fantasia
                               select new
                               {
                                   org.Id_organizacao,
                                   org.tab_status_organizacao.Id_status,
                                   org.razao_social,
                                   org.nome_fantasia,
                                   org.cnpj,
                                   org.Data_base,
                                   org.Imp_Simples,
                                   org.pat
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Organizacao organizacao = new Organizacao();
                    organizacao.IdOrganizacao = list.Id_organizacao;
                    organizacao.Status = new StatusOrganizacao(list.Id_status);
                    organizacao.RazaoSocial = list.razao_social;
                    organizacao.NomeFantasia = list.nome_fantasia;
                    organizacao.Cnpj = list.cnpj;
                    organizacao.CnpjMasc = FormataCNPJ(list.cnpj.ToString());
                    organizacao.DataBase = (list.Data_base == null) ? 0 : Int32.Parse(list.Data_base.ToString());
                    organizacao.ImpostoSimples = list.Imp_Simples;
                    organizacao.Pat = list.pat;

                    listOrganizacao.Add(organizacao);
                }

                return listOrganizacao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<Organizacao> SelectPor(int idTipoOrganizacao)
        {
            try
            {
                List<Organizacao> listOrganizacao = new List<Organizacao>();

                var consulta = from org in _context.tab_organizacao
                               join tporgan in _context.tab_tporgan_organ on org.Id_organizacao equals tporgan.tab_organizacao.Id_organizacao
                               where tporgan.tab_tipo_organizacao.id_tipo_organizacao == idTipoOrganizacao
                               select new
                               {
                                   org.Id_organizacao,
                                   org.tab_status_organizacao.Id_status,
                                   org.razao_social,
                                   org.nome_fantasia,
                                   org.cnpj,
                                   org.Data_base,
                                   org.Imp_Simples,
                                   org.pat
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Organizacao organizacao = new Organizacao();
                    organizacao.IdOrganizacao = list.Id_organizacao;
                    organizacao.Status = new StatusOrganizacao(list.Id_status);
                    organizacao.RazaoSocial = list.razao_social;
                    organizacao.NomeFantasia = list.nome_fantasia;
                    organizacao.Cnpj = list.cnpj;
                    organizacao.CnpjMasc = FormataCNPJ(list.cnpj.ToString());
                    organizacao.DataBase = (list.Data_base == null) ? 0 : Int32.Parse(list.Data_base.ToString());
                    organizacao.ImpostoSimples = list.Imp_Simples;
                    organizacao.Pat = list.pat;

                    listOrganizacao.Add(organizacao);
                }

                return listOrganizacao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<Organizacao> SelectPor(string nome, int idTipoOrganizacao)
        {
            try
            {
                List<Organizacao> listOrganizacao = new List<Organizacao>();

                var consulta = from org in _context.tab_organizacao
                               join tporgan in _context.tab_tporgan_organ on org.Id_organizacao equals tporgan.tab_organizacao.Id_organizacao
                               where tporgan.tab_tipo_organizacao.id_tipo_organizacao == idTipoOrganizacao
                               && ((nome != "") ? org.nome_fantasia.StartsWith(nome) : 1 == 1)
                               select new
                               {
                                   org.Id_organizacao,
                                   org.tab_status_organizacao.Id_status,
                                   org.razao_social,
                                   org.nome_fantasia,
                                   org.cnpj,
                                   org.Data_base,
                                   org.Imp_Simples,
                                   org.pat
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Organizacao organizacao = new Organizacao();
                    organizacao.IdOrganizacao = list.Id_organizacao;
                    organizacao.Status = new StatusOrganizacao(list.Id_status);
                    organizacao.RazaoSocial = list.razao_social;
                    organizacao.NomeFantasia = list.nome_fantasia;
                    organizacao.Cnpj = list.cnpj;
                    organizacao.CnpjMasc = FormataCNPJ(list.cnpj.ToString());
                    organizacao.DataBase = (list.Data_base == null) ? 0 : Int32.Parse(list.Data_base.ToString());
                    organizacao.ImpostoSimples = list.Imp_Simples;
                    organizacao.Pat = list.pat;

                    listOrganizacao.Add(organizacao);
                }

                return listOrganizacao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<Organizacao> SelectPatrocinadorPrestador()
        {
            try
            {
                List<Organizacao> listOrganizacao = new List<Organizacao>();

                var consulta = (from org in _context.tab_organizacao
                               join tporgan in _context.tab_tporgan_organ on org.Id_organizacao equals tporgan.tab_organizacao.Id_organizacao
                               where tporgan.tab_tipo_organizacao.id_tipo_organizacao == 1
                               || tporgan.tab_tipo_organizacao.id_tipo_organizacao == 2
                               orderby org.razao_social
                               select new
                               {
                                   org.Id_organizacao,
                                   org.tab_status_organizacao.Id_status,
                                   org.razao_social,
                                   org.nome_fantasia,
                                   org.cnpj,
                                   org.Data_base,
                                   org.Imp_Simples,
                                   org.pat
                               }).Distinct();

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Organizacao organizacao = new Organizacao();
                    organizacao.IdOrganizacao = list.Id_organizacao;
                    organizacao.Status = new StatusOrganizacao(list.Id_status);
                    organizacao.RazaoSocial = list.razao_social;
                    organizacao.NomeFantasia = list.nome_fantasia;
                    organizacao.Cnpj = list.cnpj;
                    organizacao.CnpjMasc = FormataCNPJ(list.cnpj.ToString());
                    organizacao.DataBase = (list.Data_base == null) ? 0 : Int32.Parse(list.Data_base.ToString());
                    organizacao.ImpostoSimples = list.Imp_Simples;
                    organizacao.Pat = list.pat;

                    listOrganizacao.Add(organizacao);
                }

                return listOrganizacao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void CarregarSindicato(int _idpessoa)
        {
            try
            {
                //var consulta = (from pessoa in _context.tab_pessoa
                //                join contratopessoa in _context.tab_contrato_pessoa on pessoa.Id_pessoa equals contratopessoa.tab_pessoa.Id_pessoa
                //                join contrato in _context.tab_contrato on contratopessoa.tab_contrato.Id_contrato equals contrato.Id_contrato
                //                join organizacao in _context.tab_organizacao on contrato.tab_organizacao.Id_organizacao equals organizacao.Id_organizacao
                //                where contrato.tab_status_contrato.id_status_contrato == 1
                //                && organizacao.tab_status_organizacao.Id_status == 1
                //                && pessoa.Id_pessoa == _idpessoa
                //                select new
                //                {
                //                    organizacao.Id_organizacao,
                //                    organizacao.razao_social,
                //                    organizacao.nome_fantasia,
                //                    organizacao.cnpj,
                //                    organizacao.CEI,
                //                    organizacao.Data_base,
                //                    organizacao.Imp_Simples,
                //                    organizacao.pat
                //                });

                //var listConsulta = consulta.ToList();

                //foreach (var list in listConsulta)
                //{
                //    this._idOrganizacao = list.Id_organizacao;
                //    this._razaoSocial = list.razao_social;
                //    this._nomeFantasia = list.nome_fantasia;
                //    this._cnpj = list.cnpj;
                //    this._cnpjMasc = FormataCNPJ(list.cnpj.ToString());
                //    this._dataBase = (list.Data_base == null) ? 0 : Int32.Parse(list.Data_base.ToString());
                //    this._impostoSimples = list.Imp_Simples;
                //    this._pat = list.pat;
                //}
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void SelectSindicato(int _idorganizacao)
        {
            try
            {
                //var consulta = (from organrelacao in _context.tab_organizacao_relacao_patrocinador
                //                join contrato in _context.tab_contrato on organrelacao.id_organ_relacao equals contrato.tab_organizacao_relacao_patrocinador.id_organ_relacao
                //                join organizacao in _context.tab_organizacao on contrato.tab_organizacao.Id_organizacao equals organizacao.Id_organizacao
                //                where organrelacao.tab_status.id_status == 1
                //                && contrato.tab_status_contrato.id_status_contrato == 1
                //                && organrelacao.tab_organizacao1.Id_organizacao == _idorganizacao
                //                select new
                //                {
                //                    organizacao.Id_organizacao,
                //                    organizacao.razao_social,
                //                    organizacao.nome_fantasia,
                //                    organizacao.cnpj,
                //                    organizacao.CEI,
                //                    organizacao.Data_base,
                //                    organizacao.Imp_Simples,
                //                    organizacao.pat
                //                });

                //var listConsulta = consulta.ToList();

                //foreach (var list in listConsulta)
                //{
                //    this._idOrganizacao = list.Id_organizacao;
                //    this._razaoSocial = list.razao_social;
                //    this._nomeFantasia = list.nome_fantasia;
                //    this._cnpj = list.cnpj;
                //    this._cnpjMasc = FormataCNPJ(list.cnpj.ToString());
                //    this._dataBase = (list.Data_base == null) ? 0 : Int32.Parse(list.Data_base.ToString());
                //    this._impostoSimples = list.Imp_Simples;
                //    this._pat = list.pat;
                //}
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public int RetornaIdOrganizacao(Double cnpj)
        {
            try
            {
                int idOrganizacao = 0;

                var consulta = from org in _context.tab_organizacao
                               where org.cnpj == cnpj
                               select new
                               {
                                   org.Id_organizacao,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    idOrganizacao = list.Id_organizacao;
                    break;
                }

                return idOrganizacao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public string RetornaNomeOrganizacao(int idOrganizacao)
        {
            try
            {
                string nome = string.Empty;

                var consulta = from org in _context.tab_organizacao
                               where org.Id_organizacao == idOrganizacao
                               select new
                               {
                                   org.nome_fantasia
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    nome = list.nome_fantasia;
                    break;
                }

                return nome;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persitencia
        public void Salvar()
        {
            try
            {
                if (_idOrganizacao == 0)
                {
                    tab_organizacao tabOrganizacao = new tab_organizacao();
                    //User.CarType = mydb.CarType.Where(ct => ct.CarTypeID == 1).First();
                    tabOrganizacao.tab_status_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status_organizacao", "Id_status", _status.IdStatusOrganizacao);
                    tabOrganizacao.razao_social = _razaoSocial;
                    tabOrganizacao.nome_fantasia = _nomeFantasia;
                    tabOrganizacao.cnpj = _cnpj;
                    tabOrganizacao.Imp_Simples = "S";
                    tabOrganizacao.Data_base = _dataBase;
                    //pat

                    _context.AddTotab_organizacao(tabOrganizacao);
                    _context.SaveChanges();

                    _idOrganizacao = RetornaIdOrganizacao(_cnpj);

                    foreach (TipoOrganizacaoOrganizacao item in _tipoOrganizacao)
                    {
                        item.IdOrganizacao = _idOrganizacao;
                        item.Salvar();
                    }
                }
                else
                {
                    tab_organizacao tabOrganizacao = (from o in _context.tab_organizacao
                                                      where o.Id_organizacao == _idOrganizacao
                                                      select o).First();

                    tabOrganizacao.tab_status_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status_organizacao", "Id_status", _status.IdStatusOrganizacao);
                    tabOrganizacao.razao_social = _razaoSocial;
                    tabOrganizacao.nome_fantasia = _nomeFantasia;
                    tabOrganizacao.cnpj = _cnpj;
                    tabOrganizacao.Imp_Simples = "S";
                    tabOrganizacao.Data_base = _dataBase;

                    _context.SaveChanges();

                    foreach (TipoOrganizacaoOrganizacao item in _tipoOrganizacao)
                    {
                        item.IdOrganizacao = _idOrganizacao;
                        item.Salvar();
                    }
                }
                //DM_Empresas.Cidade cidade = new DM_Empresas.Cidade();
                //cidade.ID = System.Guid.NewGuid();
                //cidade.Nome = txt_Nome.Text.Trim();
                //dm.AddToCidadeSet(cidade);
                //dm.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
